home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 25 / AACD 25.iso / AACD / Magazine / Online / QMail / source / prioq.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-15  |  889 b   |  59 lines

  1. #include "alloc.h"
  2. #include "gen_allocdefs.h"
  3. #include "prioq.h"
  4.  
  5. GEN_ALLOC_readyplus(prioq,struct prioq_elt,p,len,a,i,n,x,100,prioq_readyplus)
  6.  
  7. int prioq_insert(pq,pe)
  8. prioq *pq;
  9. struct prioq_elt *pe;
  10. {
  11.  int i;
  12.  int j;
  13.  if (!prioq_readyplus(pq,1)) return 0;
  14.  j = pq->len++;
  15.  while (j)
  16.   {
  17.    i = (j - 1)/2;
  18.    if (pq->p[i].dt <= pe->dt) break;
  19.    pq->p[j] = pq->p[i];
  20.    j = i;
  21.   }
  22.  pq->p[j] = *pe;
  23.  return 1;
  24. }
  25.  
  26. int prioq_min(pq,pe)
  27. prioq *pq;
  28. struct prioq_elt *pe;
  29. {
  30.  if (!pq->p) return 0;
  31.  if (!pq->len) return 0;
  32.  *pe = pq->p[0];
  33.  return 1;
  34. }
  35.  
  36. void prioq_delmin(pq)
  37. prioq *pq;
  38. {
  39.  int i;
  40.  int j;
  41.  int n;
  42.  if (!pq->p) return;
  43.  n = pq->len;
  44.  if (!n) return;
  45.  i = 0;
  46.  --n;
  47.  for (;;)
  48.   {
  49.    j = i + i + 2;
  50.    if (j > n) break;
  51.    if (pq->p[j - 1].dt <= pq->p[j].dt) --j;
  52.    if (pq->p[n].dt <= pq->p[j].dt) break;
  53.    pq->p[i] = pq->p[j];
  54.    i = j;
  55.   }
  56.  pq->p[i] = pq->p[n];
  57.  pq->len = n;
  58. }
  59.